package com.sromku.simple.fb.actions;
import java.lang.reflect.Type;
import android.os.Bundle;
import com.facebook.FacebookRequestError;
import com.facebook.HttpMethod;
import com.facebook.Request;
import com.facebook.RequestAsyncTask;
import com.facebook.Response;
import com.facebook.Response.PagingDirection;
import com.facebook.Session;
import com.sromku.simple.fb.SessionManager;
import com.sromku.simple.fb.listeners.OnActionListener;
import com.sromku.simple.fb.utils.Errors;
import com.sromku.simple.fb.utils.Errors.ErrorMsg;
import com.sromku.simple.fb.utils.Logger;
import com.sromku.simple.fb.utils.Utils;
public class GetAction<T> extends AbstractAction {
private String mTarget = "me"; // default
private String mEdge = null;
private OnActionListener<T> mOnActionListener = null;
private Cursor<T> mCursor = null;
private Request.Callback mCallback = new Request.Callback() {
@Override
public void onCompleted(Response response) {
final OnActionListener<T> actionListener = getActionListener();
FacebookRequestError error = response.getError();
if (error != null) {
Logger.logError(GetAction.class, "Failed to get what you have requested", error.getException());
if (actionListener != null) {
actionListener.onException(error.getException());
}
}
else {
if (response.getGraphObject() == null) {
Logger.logError(GetAction.class, "The response GraphObject has null value. Response=" + response.toString(), null);
}
else {
if (actionListener != null) {
try {
updateCursor(response);
T result = processResponse(response);
actionListener.onComplete(result);
}
catch (Exception e) {
actionListener.onException(e);
}
}
}
}
}
};
public GetAction(SessionManager sessionManager) {
super(sessionManager);
}
public void setEdge(String edge) {
mEdge = edge;
}
public void setTarget(String target) {
if (mTarget != null) {
mTarget = target;
}
}
public void setActionListener(OnActionListener<T> actionListener) {
mOnActionListener = actionListener;
}
@Override
protected void executeImpl() {
OnActionListener<T> actionListener = getActionListener();
if (sessionManager.isLogin(true)) {
Session session = sessionManager.getActiveSession();
Request request = new Request(session, getGraphPath(), getBundle(), HttpMethod.GET);
runRequest(request);
}
else {
String reason = Errors.getError(ErrorMsg.LOGIN);
Logger.logError(getClass(), reason, null);
if (actionListener != null) {
actionListener.onFail(reason);
}
}
}
protected String getTarget() {
return "me";
}
protected String getGraphPath() {
if (mEdge != null) {
return mTarget + "/" + mEdge;
}
return mTarget;
}
protected Bundle getBundle() {
Bundle bundle = new Bundle();
bundle.putString("date_format", "U");
return bundle;
}
protected OnActionListener<T> getActionListener() {
return mOnActionListener;
}
/**
* It is better to override this method and implement your faster
* conversion.
*/
protected T processResponse(Response response) {
Type type = mOnActionListener.getGenericType();
return Utils.convert(response, type);
}
void runRequest(Request request) {
OnActionListener<T> actionListener = getActionListener();
request.setCallback(mCallback);
RequestAsyncTask task = new RequestAsyncTask(request);
task.execute();
if (actionListener != null) {
actionListener.onThinking();
}
}
/**
* set next and prev pages requests
*
* @param response
*/
private void updateCursor(Response response) {
if (mOnActionListener == null) {
return;
}
if (mCursor == null) {
mCursor = new Cursor<T>(GetAction.this);
}
Request requestNextPage = response.getRequestForPagedResults(PagingDirection.NEXT);
if (requestNextPage != null) {
requestNextPage.setCallback(mCallback);
}
mCursor.setNextPage(requestNextPage);
Request requestPrevPage = response.getRequestForPagedResults(PagingDirection.PREVIOUS);
if (requestPrevPage != null) {
requestPrevPage.setCallback(mCallback);
}
mCursor.setPrevPage(requestPrevPage);
mOnActionListener.setCursor(mCursor);
}
}